package LogicaDeNegocio;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class AdministracionFechas {

	
	/**
	 * Variables
	 */
	private static AdministracionFechas admFechas = new AdministracionFechas();

	/**
	 * Constructor
	 */
	private AdministracionFechas() {
	}

	static public AdministracionFechas getInstance() {

		if (admFechas == null) {
			admFechas = new AdministracionFechas();
		}
		return admFechas;
	}
    /**
     * Metodo usado para obtener la fecha actual
     * @return Retorna un <b>STRING</b> con la fecha actual formato "dd-MM-yyyy"
     */
    public static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(ahora);
    }
    
    /**
     * Metodo usado para obtener la fecha actual en Date
     * @return Retorna un <b>DATE</b> con la fecha actual formato "dd-MM-yyyy"
     */
    public static Date getFechaActualEnDate() {
        return deStringToDate(getFechaActual());
    }
    
   /** 
    * Metodo usado para obtener la fecha en String
    * @return Retorna un <b>STRING</b> con la fecha en formato "dd-MM-yyyy"
    */
    public static String getFechaToString(Date fecha) {
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(fecha);
    }

    /** 
     * Metodo usado para obtener la hora actual del sistema
     * @return Retorna un <b>STRING</b> con la hora actual formato "hh:mm:ss"
     */
    public static String getHoraActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("hh:mm:ss");
        return formateador.format(ahora);
    }

    /**
     * Sumarle dias a una fecha determinada
     * @param fch La fecha para sumarle los dias
     * @param dias Numero de dias a agregar
     * @return La fecha agregando los dias
     */
    public static java.sql.Date sumarFechasDias(java.sql.Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, dias);
        return new java.sql.Date(cal.getTimeInMillis());
    }
    
    /**
     * Restarle dias a una fecha determinada
     * @param fch La fecha
     * @param dias Dias a restar
     * @return La fecha restando los dias
     */
    public static synchronized java.sql.Date restarFechasDias(java.sql.Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, -dias);
        return new java.sql.Date(cal.getTimeInMillis());
    }
    
    /**
     * Diferencias entre dos fechas
     * @param fechaInicial La fecha de inicio
     * @param fechaFinal La fecha de fin
     * @return El numero de dias entre dos fechas
     */
    public static synchronized int diferenciasDeFechasDias(Date fechaInicial, Date fechaFinal) {

        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
        String fechaInicioString = df.format(fechaInicial);
        try {
            fechaInicial = df.parse(fechaInicioString);
        } catch (ParseException ex) {
        }

        String fechaFinalString = df.format(fechaFinal);
        try {
            fechaFinal = df.parse(fechaFinalString);
        } catch (ParseException ex) {
        }

        long fechaInicialMs = fechaInicial.getTime();
        long fechaFinalMs = fechaFinal.getTime();
        long diferencia = fechaFinalMs - fechaInicialMs;
        double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
        return ((int) (dias));
    }
    
    public static synchronized float diferenciasDeFechasAnios(Date fechaInicial, Date fechaFinal)
    {
    	return ((float) diferenciasDeFechasDias(fechaInicial, fechaFinal)/365.0f);
    }
    
    /**
     * Devuele un java.util.Date desde un String en formato dd-MM-yyyy
     * @param fecha La fecha a convertir a formato date
     * @return la fecha en formato Date
     */
    public synchronized static java.util.Date deStringToDate(String fecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        Date fechaEnviar = null;
        try {
        	fecha = fecha.replaceAll("/", "-");
        	fechaEnviar = formatoDelTexto.parse(fecha);
            return fechaEnviar;
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }
}//end AdministracionFechas
